import {
  Color,
  IUniform,
  ShaderMaterial,
  Uniform,
  UniformsUtils,
  WebGLRenderer,
  WebGLRenderTarget,
} from "three";
import {
  FullScreenQuad,
  Pass,
} from "three/examples/jsm/postprocessing/Pass.js";
import { LuminosityHighPassShader } from "three/examples/jsm/shaders/LuminosityHighPassShader.js";

export class DemoPass extends Pass {
  fsQuad: FullScreenQuad;
  /**
   * 'tDiffuse': { value: null },
		'luminosityThreshold': { value: 1.0 },
		'smoothWidth': { value: 1.0 },
		'defaultColor': { value: new Color( 0x000000 ) },
		'defaultOpacity': { value: 0.0 }
   */
  highPassUniforms: {
    luminosityThreshold: IUniform;
    smoothWidth: IUniform;
    defaultColor: IUniform;
    defaultOpacity: IUniform;
  };
  constructor() {
    super();

    const highPassShader = LuminosityHighPassShader;
    this.highPassUniforms = UniformsUtils.clone(highPassShader.uniforms);

    this.highPassUniforms["luminosityThreshold"].value = 0.0;
    this.highPassUniforms["smoothWidth"].value = 1.0;
    this.highPassUniforms["defaultColor"].value = new Color(0x000000);
    this.highPassUniforms["defaultOpacity"].value = 0.0;

    const materialHighPassFilter = new ShaderMaterial({
      uniforms: this.highPassUniforms,
      vertexShader: highPassShader.vertexShader,
      // fragmentShader: highPassShader.fragmentShader,
      fragmentShader: `
        uniform sampler2D tDiffuse;
        uniform vec3 defaultColor;
        uniform float defaultOpacity;
        uniform float luminosityThreshold;
        uniform float smoothWidth;

        varying vec2 vUv;

        void main() {

          vec4 texel = texture2D( tDiffuse, vUv );

          vec3 luma = vec3( 0.299, 0.587, 0.114 );

          float v = dot( texel.xyz, luma );

          vec4 outputColor = vec4( defaultColor.rgb, defaultOpacity );

          float alpha = smoothstep( luminosityThreshold, luminosityThreshold + smoothWidth, v );

          float a = smoothstep(0.0, 1.0, v);

          gl_FragColor = mix( outputColor, texel, alpha );
          // gl_FragColor = vec4(alpha, 0.0, 0.0, 1.0);
          // gl_FragColor = vec4(a, 0.0, 0.0, 1.0);

        }
      `,
    });

    console.log("highPassShader.fragmentShader", highPassShader.fragmentShader);

    materialHighPassFilter.onBeforeCompile = (shader) => {
      console.log("shader.fragmentShader", shader.fragmentShader);
    };

    this.fsQuad = new FullScreenQuad(materialHighPassFilter);
  }

  render(
    renderer: WebGLRenderer,
    writeBuffer: WebGLRenderTarget,
    readBuffer: WebGLRenderTarget
  ): void {
    this.highPassUniforms["tDiffuse"].value = readBuffer.texture;
    renderer.setRenderTarget(writeBuffer);
    this.fsQuad.render(renderer);
  }
}
